package com.powergisol.gis.listener;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.powergisol.gis.dao.SzCoordsMapper;
import com.powergisol.gis.entity.SzCoords;
import com.powergisol.gis.entity.TabCoordinateSystem;
import com.powergisol.gis.exception.GlobalExceptionHandler;
import com.powergisol.gis.util.XyChangeUtil;
import com.powergisol.gis.vo.CoodrsVO;
import org.springframework.util.StringUtils;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

public class CoodrsListener extends AnalysisEventListener<CoodrsVO> {

    private List<SzCoords> szCoords = new ArrayList<>();

    private static final int BATCH_COUNT = 3000;

    private SzCoordsMapper szCoordsMapper;

    private TabCoordinateSystem system;

    private String fileType;

    public  CoodrsListener(SzCoordsMapper szCoordsMapper, TabCoordinateSystem system, String fileType) {
        this.szCoordsMapper = szCoordsMapper;
        this.system = system;
        this.fileType = fileType;
    }

    @Override
    public void invoke(CoodrsVO c, AnalysisContext analysisContext) {
        if(!StringUtils.isEmpty(c.getCoodrs()) && !c.getCoodrs().trim().equals("")){
            SzCoords szCoord = conversion(c);
            szCoords.add(szCoord);
            if(szCoords.size()>=BATCH_COUNT){
                save();
            }
        }
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        save();
    }


    private SzCoords conversion(CoodrsVO c) throws RuntimeException {
        SzCoords szCoords = new SzCoords();
        String coodrs = c.getCoodrs();

        String[] split = coodrs.replace("(", "").replace(")", "").split(",");
        if(split.length<2){
            throw new  GlobalExceptionHandler("请检查坐标测量的格式是否正确!");
        }
        BigDecimal olat = new BigDecimal(split[0]);
        BigDecimal olon = new BigDecimal(split[1]);
        BigDecimal lat = XyChangeUtil.change(olon.doubleValue(), olat.doubleValue(), system.getCoorChangeLat());
        BigDecimal lon = XyChangeUtil.change(olon.doubleValue(), olat.doubleValue(), system.getCoorChangeLon());
        szCoords.setCoordsType(fileType);
        szCoords.setOlon(olon.doubleValue());
        szCoords.setOlat(olat.doubleValue());
        szCoords.setLat(lat.doubleValue());
        szCoords.setLon(lon.doubleValue());
        szCoords.setPointNum(c.getPointNum());
        return szCoords;
    }

    private void save(){
        szCoordsMapper.insert(szCoords);
        szCoords.clear();
    }

}
